/*!
 * # 数据实体类:
 *  User - 用户
 * 
 * # 描述:
 *  表示当前用户的用户信息。
 *  
 *  Copyright (c), 上海沃恩信息科技有限公司.
 *  All rights reserved.
 *  Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

using Pittypat;

namespace Waln.Authority.Authentication.Data
{
	/// <summary>
	/// 用户。
	/// </summary>
	/// <remarks>
	/// 表示当前用户的用户信息。
	/// </remarks>
	public sealed class User : global::Pittypat.DataModel
	{
		#region 构造函数

		/// <summary>
		/// 初始化 User 类的一个新实例。
		/// </summary>
		public User()
		{
			// Id
			this.Id = null;
			// 登录名称
			this.LoginName = null;
			// 编号
			this.No = null;
			// 用户名称
			this.Name = null;
			// 头像路径
			this.FaceUrl = null;
			// 手机号码
			this.Mobile = null;
			// 电子邮件地址
			this.Email = null;
			// 创建时间
			this.CreateTime = null;
			// 锁定时间
			this.LockTime = null;
			// 登录时间
			this.LoginTime = null;
			// 登录后首页
			this.LoginHomeUrl = null;
			// 登录后首页说明
			this.LoginHomeDescription = null;
			// 服务器当前时间
			this.Now = null;
		}

		#endregion

		#region 属性

		/// <summary>
		/// 获取或者设置Id。
		/// </summary>
		public @uuid? Id { get; set; }

		/// <summary>
		/// 获取或者设置登录名称。
		/// </summary>
		/// <remarks>
		/// 用户的登录名称。
		/// </remarks>
		public @string? LoginName { get; set; }

		/// <summary>
		/// 获取或者设置编号。
		/// </summary>
		/// <remarks>
		/// 用户的编号，编号是唯一的，比如工号。登录时可以使用编号登录。
		/// </remarks>
		public @string? No { get; set; }

		/// <summary>
		/// 获取或者设置用户名称。
		/// </summary>
		/// <remarks>
		/// 用户的友好显示名称。
		/// </remarks>
		public @string? Name { get; set; }

		/// <summary>
		/// 获取或者设置头像路径。
		/// </summary>
		/// <remarks>
		/// 用户头像文件的虚拟路径。
		/// </remarks>
		public @string? FaceUrl { get; set; }

		/// <summary>
		/// 获取或者设置手机号码。
		/// </summary>
		/// <remarks>
		/// 用户的手机号码，如果提供了手机号码，必须是唯一的。
		/// </remarks>
		public @string? Mobile { get; set; }

		/// <summary>
		/// 获取或者设置电子邮件地址。
		/// </summary>
		/// <remarks>
		/// 用户的电子邮件地址。如果提供了电子邮件地址，则必须是唯一的。
		/// </remarks>
		public @string? Email { get; set; }

		/// <summary>
		/// 获取或者设置创建时间。
		/// </summary>
		/// <remarks>
		/// 创建用户账号的时间。
		/// </remarks>
		public @datetime? CreateTime { get; set; }

		/// <summary>
		/// 获取或者设置锁定时间。
		/// </summary>
		/// <remarks>
		/// 用户账号被锁定的时间。
		/// </remarks>
		public @datetime? LockTime { get; set; }

		/// <summary>
		/// 获取或者设置登录时间。
		/// </summary>
		/// <remarks>
		/// 用户最后一次登录系统的时间。
		/// </remarks>
		public @datetime? LoginTime { get; set; }

		/// <summary>
		/// 获取或者设置登录后首页。
		/// </summary>
		/// <remarks>
		/// 用户在登录后进入的页面，由用户自己配置。支持 '~' 作为前缀的路径格式。
		/// </remarks>
		public @string? LoginHomeUrl { get; set; }

		/// <summary>
		/// 获取或者设置登录后首页说明。
		/// </summary>
		/// <remarks>
		/// 对用户登录后首先进入的页面的说明信息。
		/// </remarks>
		public @string? LoginHomeDescription { get; set; }

		/// <summary>
		/// 获取或者设置服务器当前时间。
		/// </summary>
		/// <remarks>
		/// 向客户端返回服务器的当前时间。
		/// </remarks>
		public @datetime? Now { get; set; }

		#endregion

		#region 方法

		/// <summary>
		/// 从一个 DbDataReader 中读取此对象。
		/// </summary>
		/// <param name="reader">包含对象数据的 DbDataReader 对象。</param>
		/// <exception cref="global::System.ArgumentNullException">reader 是 null。</exception>
		public override void Read(global::System.Data.Common.DbDataReader reader)
		{
			if (reader == null)
			{
				throw new global::System.ArgumentNullException("reader");
			}

			// Id
			this.Id = reader.GetValue<@uuid>("Id", defaultValue: this.Id);

			// 登录名称
			this.LoginName = reader.GetValue<@string>("LoginName", defaultValue: this.LoginName);

			// 编号
			this.No = reader.GetValue<@string>("No", defaultValue: this.No);

			// 用户名称
			this.Name = reader.GetValue<@string>("Name", defaultValue: this.Name);

			// 头像路径
			this.FaceUrl = reader.GetValue<@string>("FaceUrl", defaultValue: this.FaceUrl);

			// 手机号码
			this.Mobile = reader.GetValue<@string>("Mobile", defaultValue: this.Mobile);

			// 电子邮件地址
			this.Email = reader.GetValue<@string>("Email", defaultValue: this.Email);

			// 创建时间
			this.CreateTime = reader.GetValue<@datetime>("CreateTime", defaultValue: this.CreateTime);

			// 锁定时间
			this.LockTime = reader.GetValue<@datetime>("LockTime", defaultValue: this.LockTime);

			// 登录时间
			this.LoginTime = reader.GetValue<@datetime>("LoginTime", defaultValue: this.LoginTime);

			// 登录后首页
			this.LoginHomeUrl = reader.GetValue<@string>("LoginHomeUrl", defaultValue: this.LoginHomeUrl);

			// 登录后首页说明
			this.LoginHomeDescription = reader.GetValue<@string>("LoginHomeDescription", defaultValue: this.LoginHomeDescription);

			// 服务器当前时间
			this.Now = reader.GetValue<@datetime>("Now", defaultValue: this.Now);
		}

		/// <summary>
		/// 将当前对象作为 JSON 字符串写入指定的文本流。
		/// </summary>
		/// <param name="writer">目标文本流。</param>
		/// <exception cref="global::System.ArgumentNullException">writer 是 null。</exception>
		public override void Write(global::System.IO.TextWriter writer)
		{
			if (writer == null)
			{
				throw new global::System.ArgumentNullException("writer");
			}

			writer.Write('{');

			// Id
			writer.Write("\"id\":");
			this.Id.Write(writer);
			writer.Write(',');

			// 登录名称
			writer.Write("\"loginName\":");
			this.LoginName.Write(writer);
			writer.Write(',');

			// 编号
			writer.Write("\"no\":");
			this.No.Write(writer);
			writer.Write(',');

			// 用户名称
			writer.Write("\"name\":");
			this.Name.Write(writer);
			writer.Write(',');

			// 头像路径
			writer.Write("\"faceUrl\":");
			this.FaceUrl.Write(writer);
			writer.Write(',');

			// 手机号码
			writer.Write("\"mobile\":");
			this.Mobile.Write(writer);
			writer.Write(',');

			// 电子邮件地址
			writer.Write("\"email\":");
			this.Email.Write(writer);
			writer.Write(',');

			// 创建时间
			writer.Write("\"createTime\":");
			this.CreateTime.Write(writer);
			writer.Write(',');

			// 锁定时间
			writer.Write("\"lockTime\":");
			this.LockTime.Write(writer);
			writer.Write(',');

			// 登录时间
			writer.Write("\"loginTime\":");
			this.LoginTime.Write(writer);
			writer.Write(',');

			// 登录后首页
			writer.Write("\"loginHomeUrl\":");
			this.LoginHomeUrl.Write(writer);
			writer.Write(',');

			// 登录后首页说明
			writer.Write("\"loginHomeDescription\":");
			this.LoginHomeDescription.Write(writer);
			writer.Write(',');

			// 服务器当前时间
			writer.Write("\"now\":");
			this.Now.Write(writer);

			writer.Write('}');
		}

		#endregion
	}
}
